/**
 * 商品模型
 * 用于定义商品表的结构以及相关操作
 * 
 * 数据库表定义（对应 flower_db_ddl_init.sql 中的 goods 表）：
 * - id: INT UNSIGNED AUTO_INCREMENT COMMENT '主键'
 * - name: VARCHAR(100) NOT NULL COMMENT '商品名称'
 * - category_id: INT UNSIGNED NOT NULL COMMENT '分类id' (外键 → categories.id)
 * - price: DECIMAL(10,2) NOT NULL COMMENT '售价'
 * - sales: INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '销量'
 * - stock: INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '库存'
 * - tags: JSON NULL COMMENT '标签'
 * - market_price: DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '市场价'
 * - main_img_url: VARCHAR(255) COMMENT '商品大图URL'
 * - flower_language: VARCHAR(255) COMMENT '花语'
 * - detail_json: VARCHAR(1000) COMMENT '图文详情（JSON）'
 * - is_on_sale: TINYINT NOT NULL DEFAULT 1 COMMENT '上架状态：1上架 0下架'
 * - created_at: DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)
 * - updated_at: DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
 * 
 * 索引定义：
 * - PRIMARY KEY (id)
 * - KEY idx_goods_category_id (category_id)
 * - KEY idx_goods_is_on_sale (is_on_sale)
 * - KEY idx_goods_sales (sales)
 * - KEY idx_goods_tags (CAST(tags AS CHAR(255)))
 * 
 * 外键约束：
 * - CONSTRAINT fk_goods_categories_category_id FOREIGN KEY (category_id) REFERENCES categories(id)
 */
const { DataTypes } = require('sequelize');
const { sequelize } = require('../config/database');

const Goods = sequelize.define('Goods', {
  // 主键ID，自动递增
  id: {
    type: DataTypes.INTEGER.UNSIGNED,
    primaryKey: true,
    autoIncrement: true,
    field: 'id',
    comment: '主键'
  },
  // 商品名称，不能为空
  name: {
    type: DataTypes.STRING(100),
    allowNull: false,
    field: 'name',
    comment: '商品名称'
  },
  // 分类ID，关联分类表 (外键：fk_goods_categories_category_id → categories.id)
  categoryId: {
    type: DataTypes.INTEGER.UNSIGNED,
    allowNull: false,
    field: 'category_id',
    comment: '分类id'
  },
  // 售价，不能为空
  price: {
    type: DataTypes.DECIMAL(10, 2),
    allowNull: false,
    field: 'price',
    comment: '售价'
  },
  // 销量，不能为空，默认为0
  sales: {
    type: DataTypes.INTEGER.UNSIGNED,
    allowNull: false,
    defaultValue: 0,
    field: 'sales',
    comment: '销量'
  },
  // 库存，不能为空，默认为0
  stock: {
    type: DataTypes.INTEGER.UNSIGNED,
    allowNull: false,
    defaultValue: 0,
    field: 'stock',
    comment: '库存'
  },
  // 标签，可为空
  tags: {
    type: DataTypes.JSON,
    allowNull: true,
    field: 'tags',
    comment: '标签'
  },
  // 市场价，不能为空，默认值为0.00
  marketPrice: {
    type: DataTypes.DECIMAL(10, 2),
    allowNull: false,
    defaultValue: 0.00,
    field: 'market_price',
    comment: '市场价'
  },
  // 商品大图URL，可为空
  mainImgUrl: {
    type: DataTypes.STRING(255),
    allowNull: true,
    field: 'main_img_url',
    comment: '商品大图URL'
  },
  // 花语，可为空
  flowerLanguage: {
    type: DataTypes.STRING(255),
    allowNull: true,
    field: 'flower_language',
    comment: '花语'
  },
  // 图文详情（JSON），可为空
  detailJson: {
    type: DataTypes.STRING(1000),
    allowNull: true,
    field: 'detail_json',
    comment: '图文详情（JSON）'
  },
  // 上架状态：1上架 0下架，默认为1（上架）
  onSale: {
    type: DataTypes.TINYINT,
    allowNull: false,
    defaultValue: 1,
    field: 'is_on_sale',
    comment: '上架状态：1上架 0下架'
  }
}, {
  // 指定数据库中的表名
  tableName: 'goods',
  // 启用时间戳功能，自动管理创建时间和更新时间
  timestamps: true,
  // 自定义创建时间字段名，对应数据库中的 created_at 字段
  createdAt: 'created_at',
  // 自定义更新时间字段名，对应数据库中的 updated_at 字段
  updatedAt: 'updated_at',
  // 定义表的索引（与数据库DDL完全一致）
  indexes: [
    // 为分类ID建立普通索引
    { name: 'idx_goods_category_id', fields: ['categoryId'] },
    // 为上架状态建立普通索引
    { name: 'idx_goods_is_on_sale', fields: ['onSale'] },
    // 为销量建立普通索引
    { name: 'idx_goods_sales', fields: ['sales'] },
    // 为标签建立普通索引（使用表达式索引）
    { name: 'idx_goods_tags', fields: [{ name: '(CAST(tags AS CHAR(255) ARRAY))' }] }
  ]
});

// 添加实例方法以确保字段正确序列化
Goods.prototype.toJSON = function() {
  const values = Object.assign({}, this.get());
  // 移除时间字段
  delete values.created_at;
  delete values.updated_at;
  return values;
};


module.exports = Goods;